package com.mlh.myspring.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class VehicleProxyProvider {

    private Vehicle vehicle;
    public VehicleProxyProvider(Vehicle vehicle){
        this.vehicle=vehicle;
    }
    public Vehicle getProxy(){
        //获取类加载器
        ClassLoader classLoader = vehicle.getClass().getClassLoader();
        //获取被代理类的接口信息
        Class<?>[] interfaces = vehicle.getClass().getInterfaces();
        // 创 建 InvocationHandler 对 象 - 以 匿 名 内 部 类 的 方 式 方 式 来 获 取InvocationHandler
        // 这个对象有一个方法是 invoke 到时可以通过反射，动态调用目标对象的方法

        InvocationHandler invocationHandler=new InvocationHandler(){
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("交通工具开始运行了...");
                //这里的通过反射来调用被代理对象要执行的方法
                Object res = method.invoke(vehicle, args);
                System.out.println("交通工具停止运行了...");
                return res;
            }
        };
        //将上面的 loader, interfaces, invocationHandler 构建一个 Vehicle的代理对象
        //为什么Proxy.newProxyInstance返回的对象可以转成Vehicle，我个人认为是interfaces信息被当成参数传入，因此可以根据这个信息进行某种操作
        Vehicle vehicle_proxy = (Vehicle)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        return vehicle_proxy;
    }
}
